package com.ucode.springboot.starter.web.config;

import java.text.FieldPosition;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import org.springframework.util.StringUtils;
import com.fasterxml.jackson.databind.util.StdDateFormat;
import cn.hutool.core.date.DateUtil;

/**
 * 自定义日期格式化
 * 主要解决前端传入日期格式自动转换为
 * @author: liliang
 * @date: 2019年12月17日 下午3:36:28
 */
public class UcodeDateFormat extends StdDateFormat {

    private static final long serialVersionUID = 4085191310103943257L;

    public final static StdDateFormat instance = new UcodeDateFormat();

    @Override
    public void setTimeZone(TimeZone tz) {
        //设置为中国上海时区
        super.setTimeZone(TimeZone.getTimeZone("GMT+8"));
    }

    @Override
    public StdDateFormat clone() {
        return new UcodeDateFormat();
    }

    @Override
    public Date parse(String dateStr) {
        ParsePosition pos = new ParsePosition(0);
        SimpleDateFormat sdf = null;
        if (StringUtils.isEmpty(dateStr)) {
            return null;
        }

        try {
            return DateUtil.parse(dateStr);
//            if (dateStr.length() == 10) {
////              sdf = new SimpleDateFormat("yyyy-MM-dd");
////              return sdf.parse(dateStr, pos);
//                return new Date(DatetimeUtils.parseDate(dateStr) * 86400000L);
//            }
//            if (dateStr.length() == 16) {
//                sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//                return sdf.parse(dateStr, pos);
//            }
//            if (dateStr.length() == 19) {
////              sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
////              return sdf.parse(dateStr, pos);
//                return new Date(DatetimeUtils.parseDatetime(dateStr));
//            }
//            if (dateStr.length() == 23) {
//                sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
//                return sdf.parse(dateStr, pos);
//            }
//            if (dateStr.length() == 24) {
//                sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssZ");
//                return sdf.parse(dateStr, pos);
//            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.parse(dateStr, pos);
    }

    /**
     * 这个方法可不写，jckson主要使用的是parse(String)这个方法用来转换日期格式的，
     * 只要覆盖parse(String)这个方法即可
     */
    @Override
    public Date parse(String dateStr, ParsePosition pos) {
        SimpleDateFormat sdf = null;
        if (StringUtils.isEmpty(dateStr)) {
            return null;
        }
        try {
            return DateUtil.parse(dateStr);
//            if (dateStr.length() == 10) {
////	 	            sdf = new SimpleDateFormat("yyyy-MM-dd");
////	 	            return sdf.parse(dateStr, pos);
//                return new Date(DatetimeUtils.parseDate(dateStr) * 86400000L);
//            }
//            if (dateStr.length() == 16) {
//                sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//                return sdf.parse(dateStr, pos);
//            }
//            if (dateStr.length() == 19) {
////	 	            sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
////	 	            return sdf.parse(dateStr, pos);
//                return new Date(DatetimeUtils.parseDatetime(dateStr));
//            }
//            if (dateStr.length() == 23) {
//                sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
//                return sdf.parse(dateStr, pos);
//            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.parse(dateStr, pos);
    }

    @Override
    public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
//		 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//	     return sdf.format(date, toAppendTo, fieldPosition);
//        return new StringBuffer(date != null ? DatetimeUtils.formatDatetime(date.getTime()) : "");
        return new StringBuffer(DateUtil.formatDateTime(date));
    }

}
